/*
 * @Descripttion : checkbox
 * @Author       : QianFox Team
 * @Date         : 2022-02-24 08:47:18
 * @LastEditors  : QianFox Team
 * @LastEditTime : 2022-08-16 11:40:43
 */

function Checkbox() {
    this.HANDLE = '.foxui-checkbox:not(.foxui-checkbox-all):not(.is-disabled)';
    this.HANDLEALL = '.foxui-checkbox-all:not(.is-disabled)';
    this.CONTAINER = '.foxui-checkbox-group';
    this.CHECKBOX = '.foxui-checkbox:not(.foxui-checkbox-all)';
    this.CHECKBOX_HEAD = '.foxui-checkbox-head';
    this.CHECKBOXALL = '.foxui-checkbox-all';
    this.CHECKBOXS = '.foxui-checkbox';
    this.CHECKBOX_CHECKED = '.foxui-checkbox:not(.foxui-checkbox-all).is-checked';
}

Checkbox.prototype._init = function () {
    this._bindToggle();
    this._bindToggleAll();
};

Checkbox.prototype._bindToggle = function () {
    let that = this;
    $(document).on('click', this.HANDLE, function () {
        // 操作当前 checkbox
        let isChecked = $(this).is('.is-checked');
        if (isChecked) {
            $(this).removeClass('is-checked');
            $(this).find('input').prop('checked', false);
        } else {
            $(this).addClass('is-checked');
            $(this).find('input').prop('checked', true);
        }

        // 遍历父组 全选 并作相应操作
        that._judgeParents(this);
    });
};

Checkbox.prototype._bindToggleAll = function () {
    let that = this;
    $(document).on('click', this.HANDLEALL, function () {
        // 操作当前 checkbox-all
        let $checkboxs = $(this).closest(that.CONTAINER).find(that.CHECKBOXS);
        let isChecked = $(this).is('.is-checked');
        if (isChecked) {
            $checkboxs.removeClass('is-indeterminate').removeClass('is-checked');
            $(this).find('input').prop('checked', false);
        } else {
            $checkboxs.removeClass('is-indeterminate').addClass('is-checked');
            $(this).find('input').prop('checked', true);
        }

        // 遍历父组 全选 并作相应操作
        that._judgeParents(this, true);
    });
};

Checkbox.prototype._judgeParents = function (checkbox, isAll) {
    let that = this;
    $(checkbox)
        .parents(that.CONTAINER)
        .each(function () {
            let len = $(this).find(that.CHECKBOX).length,
                checkedNum = $(this).find(that.CHECKBOX_CHECKED).length,
                // 新增，全选下没有选项也能选择
                $checkAll = isAll ? $(this).children(that.CHECKBOX_HEAD).find(that.CHECKBOXALL).not(checkbox) : $(this).children(that.CHECKBOX_HEAD).find(that.CHECKBOXALL);

            if (checkedNum !== 0) {
                if (len === checkedNum) {
                    $checkAll.removeClass('is-indeterminate').addClass('is-checked');
                    $checkAll.find('input').prop('checked', true);
                } else {
                    $checkAll.removeClass('is-checked').addClass('is-indeterminate');
                    $checkAll.find('input').prop('checked', false);
                }
            } else {
                $checkAll.removeClass('is-indeterminate').removeClass('is-checked');
                $checkAll.find('input').prop('checked', false);
            }
        });
};

let checkbox = new Checkbox();

export { checkbox };
